package com.fly.okhttp.param;

import android.text.TextUtils;

import java.io.File;
import java.util.ArrayList;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * Created with Android Studio.
 * Package_Name：com.fly.okhttp.param
 * Project_Name：OKHttpProject
 * User：郭鹏飞
 * Date：2015/11/20
 * Email：love518420@foxmail.com
 * Description：封装请求参数
 */
public class OKHttpParams {

    private ConcurrentHashMap<String, String> params; // 通过键值对存放参数
    private ConcurrentHashMap<String, ArrayList<File>> fileParams; // 存放文件参数

    private ArrayList<String> keys; // 存放键
    private ArrayList<String> fileKeys; // 存放文件键
    private String url; // 请求地址

    public OKHttpParams() {
        /*
        ConcurrentHashMap 线程安全
        注意区别
        HasMap 非线程安全
        HasTable 线程安全
        ConcurrentHashMap 线程安全（分段锁） 不接受null key null value
        * */
        params = new ConcurrentHashMap<>();
        fileParams = new ConcurrentHashMap<>();
        keys = new ArrayList<>();
        fileKeys = new ArrayList<>();
    }

    /**
     * 该构造器主要用于get请求
     *
     * @param url 访问地址
     */
    public OKHttpParams(String url) {
        this();
        this.url = url;
    }

    /**
     * 设置参数
     *
     * @param key   键
     * @param value 值
     */
    public void put(String key, String value) {
        if (TextUtils.isEmpty(key))
            throw new NullPointerException("键为空");
        if (value == null)
            throw new NullPointerException("值为null");
        // 注意键值非空判断的不同 ，防止特殊需求
        params.put(key, value);
        keys.add(key);
    }

    /**
     * 设置参数 用于文件上传
     *
     * @param key  键
     * @param file 文件
     */
    public void put(String key, File file) {
        if (file == null)
            throw new NullPointerException("file为空");
        ArrayList<File> files = new ArrayList<>();
        files.add(file);
        put(key, files);
    }

    /**
     * 设置参数
     *
     * @param key   键
     * @param files 文件集合
     */
    public void put(String key, ArrayList<File> files) {
        if (TextUtils.isEmpty(key))
            throw new NullPointerException("键为空");
        if (files == null || files.isEmpty())
            throw new NullPointerException("file集合为空");
        fileParams.put(key, files);
        fileKeys.add(key);
    }

    /**
     * 清空参数
     */
    public void clear() {
        params.clear();
        keys.clear();
    }

    /**
     * 得到完整地址
     *
     * @return String
     */
    public String getCompleteUrl() {
        if (!TextUtils.isEmpty(url)) {
            String paramsStr = spliceParams();
            if (paramsStr == null) {
                return url;
            }
            return url + "?" + paramsStr;
        }
        throw new NullPointerException("请使用带参数构造器，实例化url");
    }

    /**
     * 获取完整访问路径
     *
     * @param url 地址
     * @return 带参数的完整路径
     */
    public String getCompleteUrl(String url) {
        if (TextUtils.isEmpty(url))
            throw new NullPointerException("url为空");
        String paramsStr = spliceParams();
        if (paramsStr == null) {
            return url;
        }
        return url + "?" + paramsStr;
    }

    /**
     * 获取拼接参数
     *
     * @return String 可能为null
     */
    public String spliceParams() {
        if (!params.isEmpty()) {
            StringBuilder sb = new StringBuilder();
            // 拼接参数
            for (Map.Entry<String, String> entry : params.entrySet()) {
                sb.append(entry.getKey());
                sb.append("=");
                sb.append(entry.getValue());
                sb.append("&");
            }
            // 删除最后一个多余的 &
            sb = sb.delete(sb.length() - 1, sb.length());
            return sb.toString();
        }
        return null;
    }

    /**
     * 得到非文件key的参数值
     *
     * @param key 键
     * @return String
     */
    public String getValue(String key) {
        if (TextUtils.isEmpty(key))
            throw new NullPointerException("key为空");
        if (params.containsKey(key))
            return params.get(key);
        throw new NullPointerException("key不存在");
    }

    /**
     * 得到非文件参数键值集合
     *
     * @return ArrayList
     */
    public ArrayList<String> getKeyList() {
        return keys;
    }

    /**
     * 得到该key对应的文件集合
     *
     * @param key 键
     * @return ArrayList
     */
    public ArrayList<File> getFile(String key) {
        if (TextUtils.isEmpty(key))
            throw new NullPointerException("key为空");
        if (fileParams.containsKey(key))
            return fileParams.get(key);
        throw new NullPointerException("key不存在");
    }

    /**
     * 返回文件参数的key的集合
     *
     * @return ArrayList
     */
    public ArrayList<String> getFileKeys() {
        return fileKeys;
    }

    /**
     * 返回非文件参数的个数
     *
     * @return int
     */
    public int sizeOfNormal() {
        return params.size();
    }

    /**
     * 返回文件参数的个数
     *
     * @return int
     */
    public int sizeOfFile() {
        return fileParams.size();
    }

}
